package com.atguigu.paymentdemo.util;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;
import java.text.MessageFormat;
import java.util.concurrent.TimeUnit;
@Slf4j
public class PhoneRechargeUtil {

        private static OkHttpClient client;
        /**话费充值接口地址*/
        private static final String apiUrl_recharge = "http://op.tianjurenhe.com/ofpay/mobile/onlineorder";
        /**根据手机号和面值查询商品接口参数格式*/
//        public static final String HF_TELQUERY_PARAM = "?phoneno={0}&cardnum={1}&&key={2}";
    public static final String HF_TELQUERY_PARAM =  "?sign={0}&phoneno={1}&cardnum={2}&orderid={3}&key={4}";
    /**在个人中心查询*/
//    OpenId：
//    JHcdb9b6952528195b666de1764d3e020d
        public static final String openId = "JHcdb9b6952528195b666de1764d3e020d";
        /**申请的接口Appkey*/
//    AppKey： 040460e7b095dd0e2e9d9ca648c3c892
        public static final String key = "040460e7b095dd0e2e9d9ca648c3c892";

        private static final int TIME_OUT = 20;

        static {
            client = new OkHttpClient.Builder()
                    .connectTimeout(TIME_OUT, TimeUnit.SECONDS)
                    .readTimeout(TIME_OUT, TimeUnit.SECONDS)
                    .writeTimeout(TIME_OUT, TimeUnit.SECONDS)
                    .retryOnConnectionFailure(true)
                    .build();
        }

        /**
         * 依据用户提供的请求为指定手机直接充值
         * @param phoneNo 需要充值的手机号码
         * @param cardnum 充值金额,目前可选：1、2、5、10、20、30、50、100、300
         * @param orderId 商家订单号，8-32位字母数字组合，自定义
         * 账号id：vYXdzObXo9pO6J1oxw
         * @return 返回String结果
         * @throws Exception
         */
        public static String recharge(String phoneNo, String cardnum, String orderId) throws IOException {
            String reason=null;
            String errorCode=null;
            //OpenID+key+phoneno+cardnum+orderid
            String sign = MD5Util.MD5(openId + key + phoneNo + cardnum + orderId);
            //拼接地址与参数
            String url = apiUrl_recharge + MessageFormat.format(HF_TELQUERY_PARAM, sign, phoneNo, cardnum, orderId, key);
            System.out.println("url:"+url);
            //创建request对象实例
            Request request = new Request.Builder().url(url).build();
            //获取请求response应答
            Response response = client.newCall(request).execute();
            if(response != null){
                //返回消息体的字符串
                JSONObject result = JSONObject.parseObject(response.body().string());
                if (result.getInteger("error_code") == 0) {
                    // 订单提交成功，根据实际业务逻辑进行处理
                    reason=result.get("reason").toString();
                    errorCode=result.get("error_code").toString();
                    log.info("订单提交成功:{} ,code:{}",reason,errorCode);
                    return errorCode;

                }else{
                    // 提交返回码error_code非正常状态，依据官方文档错误码说明，进行逻辑处理
                    // 比如：10014，系统异常 / 208516，重复的订单号 等，需要进行二次查询/人工确认处理，不要直接失败处理，避免造成不必要的损失
                    reason=result.get("reason").toString();
                    errorCode=result.get("error_code").toString();
                    log.error("订单提交失败:{},code:{}",reason,errorCode);
                    return errorCode;

                }
            }else{
                // 可能网络异常等问题，未获得正确响应结果，建议进行二次查单/人工确认，不要直接失败处理，避免造成不必要的损失
                // 依据自己的业务逻辑进行处理
                return errorCode;

            }
        }
        public static void main(String[] args) throws IOException {
            recharge("18811512031", "10", "12345678");
        }

}
